//从axios框架导入axios组件
import axios from "axios";
import {jwtName, messageConfirm, messageTip, removeJwt} from "@/util/util";

//配置一下axios组件的默认接口地址前缀
axios.defaults.baseURL = "http://localhost:8089";

// 添加请求拦截器
axios.interceptors.request.use( (config) => {
    // 在发送请求之前做些什么
    let loginData = window.sessionStorage.getItem(jwtName());
    if (!loginData) {
        loginData = window.localStorage.getItem(jwtName());
        if (loginData) {
            config.headers['rememberMe'] = true;
        }
    }
    //从两处都拿了一下，如果拿到jwt，就把jwt放入请求头中
    if (loginData) {//表示存在，有值，不是空
        let login = JSON.parse(loginData);
        config.headers['Authorization'] = login.jwt;
    }
    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});


// 添加响应拦截器
axios.interceptors.response.use((response) => {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    if (response.data.code > 900) { //大于900都是jwt验证未通过，那就说明用户的登录失效
        //提示一下，jwt验证未通过，是否需要重新登录
        messageConfirm(response.data.msg + "，是否重新去登录？").then(() => { //点“确定”就执行then()函数
            //后台对jwt验证未通过，那么前台浏览器把jwt都删除一下
            removeJwt();
            //跳转到登录页
            window.location.href = "/";
        }).catch(() => { //点“取消”就执行catch()函数
            messageTip("取消去登录", "warning");
        })
    }

    return response;
}, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
});

/**
 * 封装的Get请求
 * @param url  ：  /api/login
 * @param params  :  { loginAct : "admin", loginPwd : "aaa111" }
 *
 */
export function doGet(url, params) {
    return axios({
        url: url,
        method: "get",
        params: params
    })
}

/**
 * 封装post请求
 *
 * @param url ： /api/login
 * @param data : { loginAct : "admin", loginPwd : "aaa111" }
 */
export function doPost(url, data) {
    return axios({
        url: url,
        method: "post",
        data: data
    })
}

/**
 * 封装put请求，put请求和post请求，方法封装是一样的，只需要改一下请求方式
 *
 * @param url  /api/login
 * @param data   { loginAct : "admin", loginPwd : "aaa111" }
 * @returns {Promise<axios.AxiosResponse<any>> | *}
 */
export function doPut(url, data) {
    return axios({
        url: url,
        method: "put",
        data: data
    })
}

/**
 * 封装delete请求，delete请求和get请求，方法封装是一样的，只需要改一下请求方式
 *
 * @param url   /api/login
 * @param params   { loginAct : "admin", loginPwd : "aaa111" }
 * @returns {Promise<AxiosResponse<any>> | *}
 */
export function doDelete(url, params) {
    return axios({
        url: url,
        method: "delete",
        params: params
    })
}